package com.candy.dao;

import javax.crypto.spec.PSource;
import java.sql.*;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Set;

public class DBhelperPlus {
//    main方法，程序启动入口，在idea中可以使用快捷指令  main或者psvm快速生成该方法
    public static void main(String[] args) {
//        异常处理，主动捕获的方式，在idea里面的快捷键（alt+t或者ctrl+alt+t)可以自动生成try方法
        try {
    //    （1）注册或实例化jdbc的驱动类
                Class.forName("com.mysql.cj.jdbc.Driver");
    //    （2）获取数据库连接对象Connection
//            jdbc:mysql表示使用jdbc链接mysql数据库
//            localhost表示要链接的数据库所在的地址（ip），此时的localhost表示本机，可以用127.0.0.1代替
//            3306是mysql数据库的端口号
//            database_name表示你要链接的数据库的名字
            String url="jdbc:mysql://localhost:3306/ld_mysql0317? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true";
            String username="root";
            String password="123456";
            Connection conn=DriverManager.getConnection(url,username,password);
    //    （3）获取数据库操作对象Statement（执行增删改查）
            Statement ment= conn.createStatement();
    //    （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
            String sql="select * from userinfo;";
            ResultSet re= ment.executeQuery(sql);
    //    （5）解析结果集对象ResultSet，进行相关的业务处理；
//            当前行有数据则返回true，反之返回false
//            为了解决资源关闭后无法获取数据的问题，这里需要对数据进行转储
//            常见的数据转储的方式有两种，第一种：List+Map；第二种是List+JavaBean
//            准备容器，这里采用List+Map的方式进行转储
            LinkedList<LinkedHashMap<String,Object>> lp=new LinkedList();
//            准备好一个map，存储每一行的数据
            LinkedHashMap eachRow=null;
//            这里需要知道表中一个有多少个列，每个列的列名是什么，方便后续进行存放在map中
//            获取元数据（能够知道数据的结构组成）
            ResultSetMetaData rm=re.getMetaData();
//            获取数据表中一共有多少个列
            int count=rm.getColumnCount();
            while (re.next()){
               eachRow=new LinkedHashMap();
//               循环取出数据，并将数据存储在map中
                for (int i = 1; i <=count ; i++) {
//                    rm.getColumnName(i)取出该列对应的列名
//                    re.getObject(i)：通过该列的索引取出该列对应值
                    eachRow.put(rm.getColumnName(i),re.getObject(i));
                }
//               将每一行数据存放在list集合中
                lp.add(eachRow);
            }
    //     (6)关闭资源；资源关闭要有顺序，先关闭ResultSet,再关闭Statement，最后关闭Connection
            re.close();
            ment.close();
            conn.close();
            System.out.println("资源关闭之后...");
//            可以直接从容器（lp)里面取出数据
//            foreach循环：语法for(要遍历的集合中的每一个数据 的 数据类型 要遍历的单元的 假名：要遍历的集合的名字）{}
            for (LinkedHashMap<String,Object> map : lp){
//                取出该map中所有key放在set集合中
                Set se=map.keySet();
//                对set集合进行遍历，循环取出每个key对应的value
                for (Object key:se){
//              map.get(key)取出指定key所包含的value
                    System.out.print(key+"："+map.get(key)+"\t");
                }
                System.out.println();
            }


        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

}
